package com.tap5.hotelbooking.entities; import static javax.persistence.TemporalType.DATE; import java.io.Serializable; import java.math.BigDecimal; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; /** * <p> * <strong>Booking</strong> is the model/entity class that represents a hotel booking. * </p> * * @author Gavin King * @author Dan Allen */ @Entity @NamedQueries( { @NamedQuery(name = Booking.BY_USERNAME, query = "Select b from Booking b where b.user.username = :username") }) @Table(name = "bookings") public class Booking implements Serializable { /** * */ private static final long serialVersionUID = -6176295317720795275L; public static final String BY_USERNAME = "Booking.byUsername"; private Long id; private User user; private Hotel hotel; private Date checkinDate; private Date checkoutDate; private String creditCardNumber; private CreditCardType creditCardType; private String creditCardName; private int creditCardExpiryMonth; private int creditCardExpiryYear; private boolean smoking; private int beds; private Date creationDate; @Transient private boolean status; public Booking() { } public Booking(Hotel hotel, User user, int daysFromNow, int nights) { this.hotel = hotel; this.user = user; this.creditCardName = user.getFullname(); this.smoking = false; this.beds = 1; setReservationDates(daysFromNow, nights); creditCardExpiryMonth = Calendar.getInstance().get(Calendar.MONTH) + 1; this.creationDate = new Date(); this.status = false; } @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @NotNull @Temporal(DATE) public Date getCheckinDate() { return checkinDate; } public void setCheckinDate(Date datetime) { this.checkinDate = datetime; } @NotNull @ManyToOne public Hotel getHotel() { return hotel; } public void setHotel(Hotel hotel) { this.hotel = hotel; } @NotNull @ManyToOne public User getUser() { return user; } public void setUser(User user) { this.user = user; } @NotNull @Temporal(TemporalType.DATE) public Date getCheckoutDate() { return checkoutDate; } public void setCheckoutDate(Date checkoutDate) { this.checkoutDate = checkoutDate; } public boolean isSmoking() { return smoking; } public void setSmoking(boolean smoking) { this.smoking = smoking; } // @Size(min = 1, max = 3) public int getBeds() { return beds; } public void setBeds(int beds) { this.beds = beds; } @NotNull(message = "Credit card number is required") @Size(min = 16, max = 16, message = "Credit card number must 16 digits long") @Pattern(regexp = "^\\d*$", message = "Credit card number must be numeric") public String getCreditCardNumber() { return creditCardNumber; } public void setCreditCardNumber(String creditCardNumber) { this.creditCardNumber = creditCardNumber; } @NotNull(message = "Credit card type is required") @Enumerated(EnumType.STRING) public CreditCardType getCreditCardType() { return creditCardType; } public void setCreditCardType(CreditCardType creditCardType) { this.creditCardType = creditCardType; } @NotNull(message = "Credit card name is required") @Size(min = 3, max = 70, message = "Credit card name is required") public String getCreditCardName() { return creditCardName; } public void setCreditCardName(String creditCardName) { this.creditCardName = creditCardName; } /** * The credit card expiration month, represented using a 1-based numeric value (i.e., Jan = 1, * Feb = 2, ...). * * @return 1-based numeric month value */ public int getCreditCardExpiryMonth() { return creditCardExpiryMonth; } public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { this.creditCardExpiryMonth = creditCardExpiryMonth; } /** * The credit card expiration year. * * @return numberic year value */ public int getCreditCardExpiryYear() { return creditCardExpiryYear; } public void setCreditCardExpiryYear(int creditCardExpiryYear) { this.creditCardExpiryYear = creditCardExpiryYear; } @Transient public String getDescription() { DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); return hotel == null ? null : hotel.getName() + ", " + df.format(getCheckinDate()) + " to " + df.format(getCheckoutDate()); } @Transient public BigDecimal getTotal() { return hotel.getPrice().multiply(new BigDecimal(getNights())); } @Transient public int getNights() { return (int) (checkoutDate.getTime() - checkinDate.getTime()) / 1000 / 60 / 60 / 24; } /** * Initialize the check-in and check-out dates. * * @param daysFromNow * Number of days the stay will begin from now * @param nights * Length of the stay in number of nights */ public void setReservationDates(int daysFromNow, int nights) { Calendar refDate = Calendar.getInstance(); refDate.set( refDate.get(Calendar.YEAR), refDate.get(Calendar.MONTH), refDate.get(Calendar.DAY_OF_MONTH) + daysFromNow, 0, 0, 0); setCheckinDate(refDate.getTime()); refDate.add(Calendar.DAY_OF_MONTH, nights); setCheckoutDate(refDate.getTime()); } public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public Boolean getStatus() { return status; } public void setStatus(Boolean status) { this.status = status; } @Override public String toString() { return "Booking(" + user + ", " + hotel + ")"; } }